
        <html>
			<head>
			     <title>代码审计入门总结 - sixwhale</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/tips/12751">http://drops.wooyun.org/tips/12751</a></h1>
				
      <p>
        <h1>0x00 简介</h1>

<hr />

<p>之前看了seay写的PHP代码审计的书，全部浏览了一遍，作为一个代码审计小白，希望向一些和我一样的小白的人提供一下我的收获，以及一个整体的框架和常见漏洞函数。这也算是这本书的一个学习笔记吧，可以结合我捋顺的思路来看这本书。: )</p>

<!--more-->

<h1>0x01 整体</h1>

<hr />

<p>学习代码审计的目标是能够独立完成对一个CMS的代码安全监测。其通用的思路有：</p>

<ul>
<li>通读全文代码，从功能函数代码开始阅读，例如<code>include</code>文件夹下的<code>common_fun.php</code>，或者有类似关键字的文件。</li>
<li>看配置文件，带有<code>config</code>关键字的文件，找到mysql.class.php文件的connect()函数，查看在数据库连接时是否出现漏洞。</li>
<li>继续跟读首页文件,<code>index.php</code>,了解程序运作时调用了哪些函数和文件 以index.php文件作为标线，一层一层去扩展阅读所包含的文件，了解其功能，之后进入其功能文件夹的首页文件，进行扩展阅读。</li>
</ul>

<h1>0x02 各种洞洞</h1>

<hr />

<h3>a.文件操作漏洞</h3>

<ul>
<li>能不用文件名参数就不用 尽量不要让用户可控</li>
<li>平行用户的权限 管理员的权限 操作权限</li>
<li>禁止传入参数类似于这种 <code>..</code> ,<code>/</code>,<code>\</code> 检查传入的参数,做出限制,停止程序往下执行</li>
</ul>

<h4>1.文件包含漏洞：</h4>

<p>(1) 本地文件包含：</p>

<ul>
<li>一般存在于模块加载，模板加载，cache调用</li>
<li>包括函数：<code>include()/include_once()</code>，<code>require()/require_once()</code>寻找可控变量 </li>
</ul>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404355849818115.jpg" alt="p1" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436007223726.jpg" alt="p2" /></p>

<p>(2) 远程文件包含：</p>

<ul>
<li>前提条件：<code>allow_url_include = on</code></li>
<li>出现频率不如本地包含</li>
</ul>

<p>(3) 文件包含截断：</p>

<ul>
<li>%00截断(php版本小于5.3)</li>
<li>问号截断(问号后面相当于请求的参数，伪截断)</li>
<li>英文(.) 反斜杠(/) 截断</li>
</ul>

<h4>2.文件读取(下载)漏洞：</h4>

<p>搜索关键函数:</p>

<p><code>file_get_contents()</code>,<code>highlight_file()</code>,<code>fopen()</code>,<code>read file()</code>,<code>fread()</code>,<code>fgetss()</code>, <code>fgets()</code>,<code>parse_ini_file()</code>,<code>show_source()</code>,<code>file()</code>等</p>

<h4>3.文件上传漏洞：</h4>

<p>搜索关键函数:</p>

<p><code>move_uploaded_file()</code> 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。</p>

<p>(1) 未过滤或本地过滤：服务器端未过滤，直接上传PHP格式的文件即可利用。</p>

<p>(2) 黑名单扩展名过滤：</p>

<ul>
<li>限制不够全面：IIS默认支持解析<code>.asp</code>,<code>.cdx</code>, <code>.asa</code>,<code>.cer</code>等。</li>
<li>扩展名可绕过：</li>
</ul>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436029887235.jpg" alt="p3" /></p>

<p>不被允许的文件格式<code>.php</code>，但是我们可以上传文件名为<code>1.php</code>(注意后面有一个空格)</p>

<p>(3) 文件头 <code>content-type</code>验证绕过：</p>

<ul>
<li><code>getimagesize()</code>函数：验证文件头只要为GIF89a，就会返回真。</li>
<li>限制<code>$_FILES["file"]["type"]</code>的值 就是人为限制content-type为可控变量。</li>
</ul>

<p>(4) 防范：</p>

<ul>
<li>使用<code>in_array()</code>或 利用三等于<code>===</code>对比扩展名。</li>
<li>保存上传文件是重命名，规则采用时间戳拼接随机数：<code>md5(time() + rand(1,1000))</code>。</li>
</ul>

<h4>4.文件删除漏洞：</h4>

<p>搜索关键函数：</p>

<ul>
<li><code>unlink()</code>利用回溯变量的方式 </li>
<li>老版本下的<code>session_destroy()</code>，可以删除文件，现已基本被修复。</li>
</ul>

<p><strong>Metinfo的任意文件删除漏洞：</strong></p>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436037462245.jpg" alt="p4" /></p>

<p><code>$action = delete</code>即可删除<code>.sql</code>的文件，如果文件不是<code>sql</code>直接删除提交的文件名</p>

<p><code>target.com/recovery.php?&amp;action=delete&amp;filename=../../index.php</code></p>

<h3>b.代码执行漏洞</h3>

<h4>1.代码执行函数：</h4>

<p>搜索关键函数：<code>eval()</code>, <code>assert()</code>, <code>preg_replace()</code>, <code>call_user_func()</code>, <code>call_user_func_array()</code>, <code>array_map()</code></p>

<p>(1) <code>preg_replace()</code>函数：</p>

<p><code>mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &amp;$count ]] )</code></p>

<p><strong>当$pattern处存在e修饰符时，$replacement 会被当做php代码执行。</strong></p>

<p>(2)<code>mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)</code>：</p>

<p><strong>第一个参数为回调函数，第二个参数是回调函数的参数</strong></p>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436051465155.jpg" alt="p5" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436067304765.jpg" alt="p6" /></p>

<p>(3)<code>eval()</code>和<code>assert()</code>：</p>

<p><strong>当assert()的参数为字符串时 可执行PHP代码</strong></p>

<p>【区分】：</p>

<pre><code>eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】
assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】
</code></pre>

<h4>2.动态函数执行：</h4>

<p>动态函数后门：</p>

<pre><code>#!php
&lt;?php
$_GET['a']($_GET['b']);
?&gt;
</code></pre>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436088386974.jpg" alt="p7" /></p>

<h4>3.命令执行函数：</h4>

<p>搜索关键函数：<code>system()</code>, <code>exec()</code>, <code>shell_exec()</code>, <code>passthru()</code> ,<code>pcntl_exec()</code>, <code>popen()</code>,<code>proc_open()</code></p>

<p>(1) <code>popen</code>和<code>proc_open()</code>：</p>

<pre><code>#!php
&lt;?php 
popen( 'whoami &gt;&gt; /Users/bingdaojueai/Desktop/1.txt', 'r' ); 
?&gt;
</code></pre>

<p>所在路径就会出现一个1.txt 里面的内容为命令执行后的结果</p>

<p>(2) 反引号命令执行：</p>

<ul>
<li><p>echo <code>whoami</code>; 直接就可以执行命令</p></li>
<li><p>双引号和单引号的区别：</p>

<pre><code>#!php
$a = 1
echo " $a "    output：1
echo ' $a '    output：$a
</code></pre></li>
</ul>

<p><strong>双引号时，可以直接解析变量，造成代码执行漏洞，过狗绕过。</strong></p>

<h3>c.变量覆盖漏洞</h3>

<h4>1.函数使用不当：</h4>

<ul>
<li><code>int extract( array &amp;$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )</code></li>
<li><code>void parse_str( string $str , array &amp;$arr )</code></li>
<li><code>bool import_request_variables( string $type , string $prefix )</code> </li>
</ul>

<h4>2.$$变量覆盖：</h4>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436094880083.jpg" alt="p8" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/201602140436105542792.jpg" alt="p9" /></p>

<h3>d.逻辑漏洞</h3>

<p>需要思考的问题：</p>

<ul>
<li>程序是否可以重复安装</li>
<li>修改密码是否存在越权修改其他用户密码</li>
<li>找回密码验证码是否可以暴力破解</li>
<li>cookie是否可以预测 验证存在绕过</li>
</ul>

<h4>1.等于与存在判断绕过：</h4>

<p>(1) <code>in_array()</code>: <strong>比较之前会自动转换类型</strong></p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361241005102.jpg" alt="p10" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361353028116.jpg" alt="p11" /></p>

<p>(2)<code>is_numeric()</code>:<strong>当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞</strong></p>

<p>(3)双等于<code>==</code>和三等于<code>===</code>：</p>

<ul>
<li>双等于会在变量比较时，进行类转换，与<code>in_array()</code>是一样的问题。</li>
<li>三等于是<strong>type</strong>和<strong>value</strong>的双重比较，相比之下更加安全。</li>
</ul>

<h4>2.账户体系中的越权问题：</h4>

<ul>
<li>水平越权：<strong>A用户能够以B用户的身份，进行B用户的全部权限操作。前提A用户和B用户拥有相同的权限。</strong></li>
<li>垂直越权：<strong>A用户能够以C用户的身份，进行C用户的全部权限操作，前提C用户比A用户拥有更高的权限。</strong></li>
</ul>

<p>(1) 未<code>exit</code>/<code>return</code>/<code>die</code>：</p>

<pre><code>#!php
&lt;?php
if(file_exists('install.lock)){
    header("Location:xxx.com");
    //exit();
}
echo "test";
?&gt;
</code></pre>

<p>test 依旧会被输出，替换成安装流程，PHP依旧会进行。</p>

<p>(2) 支付漏洞：</p>

<ul>
<li>客户端修改单价</li>
<li>客户端修改总价和购买数量</li>
<li>服务端未校验严格</li>
<li><p>重复发包利用时间差：</p>

<pre><code>#!php
&lt;?php
if (check_money($price)){
  //Do something
  //花费几秒
  $money = $money - $price;
}
?&gt;
</code></pre></li>
</ul>

<p><strong>可能导致漏洞函数：</strong> <code>str_replace()</code></p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361420677122.jpg" alt="p12" /></p>

<pre><code>#!php
&lt;?php
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo "$a&lt;br&gt;$b&lt;br&gt;";
$c = str_replace($a,'',$b);
echo trim($c);
?&gt;
</code></pre>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361627831132.jpg" alt="p13" /></p>

<h3>e.会话认证漏洞</h3>

<ul>
<li><p>COOKIE验证：没有使用SESSION验证，将信息直接保存在COOKIE中</p>

<ol>
<li>找到传入sql语句的参数的传递过程 回溯变量到最原始的函数 看它保存在cookie的算法 是否可逆</li>
<li>和MD5比起 sha1更安全 解密sha1的网站更少</li>
<li>限制一个用户只能同时在一个IP上登录</li>
</ol></li>
<li><p>审计代码时，查看登录处代码</p></li>
</ul>

<h3>f.二次漏洞</h3>

<h4>1.类型：</h4>

<ul>
<li>不是逻辑问题，是可信问题。</li>
<li>业务逻辑复杂度，与二次漏洞触发率 成正比。</li>
<li>购物车 / 订单 / 引用数据 / 文章编辑 / 草稿 <code>==&gt;</code> SQL注入 / XSS</li>
</ul>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361759596141.jpg" alt="p14" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404361981541151.jpg" alt="p15" /></p>

<h4>2.技巧：</h4>

<p>(1) 钻GPC等转义的空子：</p>

<ul>
<li>不受GPC保护的<code>$_SERVER</code>变量：<strong>PHP5以后，$_SERVER取到的header不再受GPC影响，就算开启特殊字符也不会被转义，存在注入</strong></li>
<li><p>编码问题转换：</p>

<ol>
<li>GBK的宽字节注入：<strong><code>%df '</code> 单引号自动被转义成(%5c)，同时<code>%df</code>与<code>%5c</code>连在一起组合成<code>運</code>字单引号依然在，成功闭合。【php与mysql交互过程中发生的编码转换问题】</strong></li>
<li><p><code>mb_convert_encoding()</code>：</p>

<pre><code>#!php
&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/&gt; 
&lt;?php
$sql = "WHERE id='".urldecode("-1%df%5c' == ")."'"; 
print_r(mb_convert_encoding($sql,"UTF-8","GBK"));
?&gt;
</code></pre></li>
</ol></li>
</ul>

<p>(2)字符串问题：</p>

<ul>
<li>利用报错，找到敏感信息</li>
<li><p>字符串截断：</p>

<ol>
<li><p>%00空字符截断：【PHP版本小于5.3】</p>

<pre><code>#!php
&lt;?php                                 
include($_GET['file'].'.php');      
//1.php?file=2.txt%00
//2.txt里面是 &lt;?php phpinfo()?&gt;
?&gt;
</code></pre></li>
<li><p>iconv函数字符编码转换截断：【对PHP版本有要求】</p>

<pre><code>#!php
chr(128)—chr(255)可以截断字符
&lt;?php 
$a = '1'.chr(130).'2’; 
echo $a."&lt;br&gt;";                   //1�2
echo iconv("UTF-8", "GBK", $a);   //1
?&gt;
</code></pre></li>
</ol></li>
<li><p>php:// 输入输出流：</p>

<pre><code>#!php
&lt;?php
    include($_GET[‘file']);
?&gt;
1.php?file=php://filter/convert.base64-encode(内容被base64编码)/resource=example.txt(远程文件)
</code></pre></li>
<li><p>php代码解析标签：</p>

<ol>
<li><code>&lt;script language="php"&gt;…&lt;/script&gt;</code></li>
<li><code>&lt;?…?&gt;</code>：<strong>php3.0.4版本后可用</strong></li>
<li><code>&lt;%…%&gt;</code>：<strong>asp标签，需要asp_tags=on，默认是off</strong></li>
</ol></li>
<li><p>正则表达式：</p>

<ol>
<li>没有使用^ 和 $ 限定匹配开始位置：</li>
<li>特殊字符未转义：</li>
</ol></li>
<li><p>报错注入：</p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404362023392161.jpg" alt="p16" /></p>

<p><img src="http://static.wooyun.org//drops/20160214/2016021404362284187171.jpg" alt="p17" /></p></li>
<li><p><code>windows findfirstfile</code> 利用：<strong>若要搜索12345.txt文件，可使用<code>1&lt;&lt;</code>来代替或者<code>12&lt;&lt;</code>，不可以单独使用一个<code>"&lt;"</code>或<code>"&gt;"</code>，因为单独一个只是代表了一个字符，两个代表多个字符。</strong></p></li>
</ul>

<h1>0x03 End</h1>

<hr />

<p>自己走上安全这条路既是兴趣也是偶然，选择白盒完全是因为喜欢php，毕竟是初识代码审计，seay的书确实帮了我不少，抱作者大腿<strong>（我是萌妹纸）</strong>，希望这篇文章能够帮助像我一样小白的人，花了两天总结的，如果有什么缺陷也等着大家指出。</p>

<blockquote>
  <p>不会开发的谈审计都是耍流氓！：)</p>
</blockquote>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          